package webStudio7i.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.sql.*;

import webStudio7i.excepcion.DAOExcepcion;
import webStudio7i.modelo.Alquiler;
import webStudio7i.modelo.AlquilerDetalle;
import webStudio7i.modelo.Servicio;
import webStudio7i.modelo.Usuario;
import webStudio7i.util.ConexionBD;

public class AlquilerDAO extends BaseDAO {

	public boolean insertarAlquiler(Alquiler alq) throws DAOExcepcion {
		System.out.println("AlquilerDAO: insertar(Alquiler vo)");
		String query ="SELECT COUNT(*) FROM alquiler WHERE estado not in ('R','T') " +
		" AND sala_idsala = ? AND fechahora_inicio = ? AND fechahora_fin = ?"; 
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null; 
		boolean rpta = false;
		try {
			con = ConexionBD.obtenerConexion();
			con.setAutoCommit(false);
			stmt = con.prepareStatement(query);
			stmt.setInt(1, alq.getObjSala().getIdsala());
			stmt.setString(2, alq.getFechahora_inicio());
			stmt.setString(3,  alq.getFechahora_fin());
			rs = stmt.executeQuery();
			int cnt = 0; 
			if(rs.next()){
				cnt = rs.getInt(1);
			}
			if(cnt == 0){
				query = "INSERT INTO alquiler (sala_idsala, usuario_idusuario, " +
						" porcentaje_igv, fechahora_inicio,fechahora_fin , estado, "+
						" idusuario_actualizacion,fechahora_creacion,fechahora_actualizacion) VALUES (?,?,18,?,?,?,?,SYSDATE(),SYSDATE())";
				stmt = con.prepareStatement(query);
				stmt.setInt(1, alq.getObjSala().getIdsala());
				stmt.setInt(2, alq.getIdusuario_actualizacion());
				stmt.setDouble(3, alq.getPorcentaje_igv());
				stmt.setString(4, alq.getFechahora_inicio());
				stmt.setString(5, alq.getFechahora_fin());
				stmt.setString(6, alq.getEstado());
				stmt.setInt(7, alq.getIdusuario_actualizacion());
				int i = stmt.executeUpdate();
				if (i != 1) {
					throw new SQLException("No se pudo insertar");
				}
					int idalquiler = 0;
					query = "SELECT LAST_INSERT_ID()";
					stmt = con.prepareStatement(query);
					rs = stmt.executeQuery();
					if (rs.next()) {
						idalquiler = rs.getInt(1);
					}
					alq.setIdalquiler(idalquiler);
					if(alq.getCltAquilerDetalle().size() > 0){
					for (AlquilerDetalle objalq : alq.getCltAquilerDetalle())
					{
						query = "INSERT INTO alquiler_detalle (servicio_idservicio, alquiler_idalquiler, " +
								" precio_unitario, cantidad) VALUES (?,?,?,?)";
						stmt = con.prepareStatement(query);
						stmt.setInt(1, objalq.getObjServicio().getIdservicio());
						stmt.setInt(2, alq.getIdalquiler());
						stmt.setDouble(3, objalq.getPrecio_unitario());
						stmt.setInt(4, objalq.getCantidad());
						rpta =  true;
					}
					}else {
						throw new DAOExcepcion("No esta grabando al menos un detalle");
					}
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			try {
				con.setAutoCommit(true);
			} catch (SQLException e) {
				throw new DAOExcepcion(e.getMessage());
			}
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return rpta; 
	}
	

	public Collection<Alquiler> ConsultarAlquiler(Alquiler alq) throws DAOExcepcion {
		System.out.println("AlquilerDAO: ConsultarAlquiler(Alquiler alq)");
		String query ="select nombre,apellido, fechahora_inicio,fechahora_fin,sum(precio_unitario) as total " +
				" from alquiler, alquiler_detalle,  usuario, persona " +
				" where alquiler.idalquiler = alquiler_detalle.alquiler_idalquiler " +
				" and usuario.idusuario = alquiler.usuario_idusuario " +
				" and usuario.persona_idpersona = persona.idpersona " +
				" and DATE(fechahora_inicio) BETWEEN  ? and  ? and sala_idsala = ? group by nombre,apellido"; 
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null; 
		Collection<Alquiler> CltAlq = new ArrayList<Alquiler>();
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, alq.getFechahora_inicio());
			stmt.setString(2, alq.getFechahora_fin());
			stmt.setInt(3, alq.getObjSala().getIdsala());
			rs = stmt.executeQuery();
			while(rs.next()){
				Alquiler a = new Alquiler(); 
				Usuario objUsu = new Usuario();
				objUsu.setNombre(rs.getString(1));
				objUsu.setApellido(rs.getString(2));
				a.setUsuario(objUsu);
				a.setFechahora_inicio(rs.getString(3));
				a.setFechahora_fin(rs.getString(4));
				a.setPorcentaje_igv(rs.getDouble(5));
				CltAlq.add(a);
			}
			if(CltAlq.size() < 1){
				throw new DAOExcepcion("No se encuentraron salas con los datos indicados");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return CltAlq; 
	}
	
	
	
	
	
	
}
